package models;

import java.sql.SQLException;
import java.util.GregorianCalendar;
import java.util.List;

import models.dados.BancoAdapter;
import models.dados.BancoTeste;
import models.dados.ChaveRepetidaException;
import models.dados.DAO;
import models.dados.DadoNaoEncontradoException;
import play.db.jpa.Model;

public class GerenciaAdministradores {

	private DAO banco;

	public GerenciaAdministradores() {
		banco = BancoAdapter.getInstancia();
	}

	private Administrador carregarUsuario(String usuario)
			throws DadoNaoEncontradoException, SQLException {
		return banco.getAdministrador(usuario);
	}

	public void cadastrarAdministrador(Administrador novoAdministrador,
			String cadastradoPor) throws DadoNaoEncontradoException,
			AcessoNegadoException, ChaveRepetidaException, SQLException {
		Usuario adm = carregarUsuario(cadastradoPor);
		if (adm.estaAtivo() && adm.getTipo() == TipoUsuario.ADM_SUPER) {

			banco.inserirAdministrador(novoAdministrador);
		} else {
			throw new AcessoNegadoException();
		}
	}

	public void removerAdministrador(String usuarioCadastro,
			String administrador) throws DadoNaoEncontradoException, SQLException {
		Administrador adm = carregarUsuario(usuarioCadastro);
		if (adm.estaAtivo() && adm.getTipo() == TipoUsuario.ADM_SUPER) {
			banco.removerAdministrador(administrador);
		}
	}

	public void ativarAdministrador(String usuario, boolean ativar,
			String ativadoPor) throws DadoNaoEncontradoException, SQLException {
		Administrador adm = carregarUsuario(ativadoPor);
		if (adm.estaAtivo() && adm.getTipo() == TipoUsuario.ADM_SUPER) {
			Administrador admAlteracao = banco.getAdministrador(usuario);
			if (!admAlteracao.estaAtivo() == ativar) {
				admAlteracao.setAtivo(ativar);
				banco.alterarAdministrador(admAlteracao);
			}
		}
	}
	
	public void alterarAdministrador(Administrador administrador,String alteradoPor){
		banco.alterarAdministrador(administrador);
	}

	public List<Administrador> listarAdministradores(String usuario,TipoUsuario tipo,String cadastradoPor,GregorianCalendar dataCadastro,boolean bloqueado,
			boolean naoBloqueado,boolean ativo,boolean inativo) {
		return banco.listarAdministradores(usuario, tipo, cadastradoPor, dataCadastro, bloqueado,naoBloqueado,ativo,inativo);
	}

}
